package com.wpen.unit.service.job.impl;

import java.util.Date;
import java.util.List;

import com.wpen.unit.service.job.AgentRegistryService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import com.wpen.unit.cvt.job.AgentRegistryCvt;
import com.wpen.unit.enums.OnlineStatus;
import com.wpen.unit.enums.YN;
import com.wpen.unit.exception.BizException;
import com.wpen.unit.infra.mybatis.job.po.AgentRegistryPo;
import com.wpen.unit.infra.repository.job.AgentRegistryRepository;
import com.wpen.unit.web.dto.AgentRegistryRequest;
import com.wpen.unit.web.dto.AgentRegistryResponse;
import com.wpen.unit.web.dto.job.AgentRegistryListRequest;
import com.wpen.unit.web.dto.job.AgentRegistryListResponse;
import com.wpen.unit.web.dto.job.AgentRegistryListRowsResponse;
import com.wpen.unit.web.dto.job.AgentRegistryModRequest;
import com.wpen.unit.web.dto.job.AgentRegistryModResponse;
import com.wpen.unit.web.dto.job.AgentRegistryOfflineRequest;
import com.wpen.unit.web.dto.job.AgentRegistryOfflineResponse;
import com.wpen.unit.web.dto.job.AgentRegistryOnlineRequest;
import com.wpen.unit.web.dto.job.AgentRegistryOnlineResponse;
import com.wpen.unit.web.dto.job.StatRequest;
import com.wpen.unit.web.dto.job.StatResponse;

/**
 * 执行器注册业务处理.
 * 
 * @author Wang Peng
 * @date 2022-12-08
 */
@Service
public class AgentRegistryServiceImpl implements AgentRegistryService {

	@Autowired
	private AgentRegistryRepository agentRegistryRepository;

	@Override
	public AgentRegistryListResponse queryListAgentRegistry(AgentRegistryListRequest agentRegistryListRequest) {
		int index = agentRegistryListRequest.getIndex();
		int size = agentRegistryListRequest.getSize();
		// 数据库查询
		AgentRegistryPo agentRegistryPo = AgentRegistryCvt.INSTANCE.queryListDto2Do(agentRegistryListRequest);

		long total = agentRegistryRepository.count(agentRegistryPo);
		List<AgentRegistryPo> agentRegistryPoLists = agentRegistryRepository.queryList(index, size, agentRegistryPo);

		// 返回响应信息
		AgentRegistryListResponse agentRegistryListResponse = new AgentRegistryListResponse();
		agentRegistryListResponse.setTotal(total);
		agentRegistryListResponse.setCount(0);
		if (agentRegistryPoLists != null) {
			agentRegistryListResponse.setCount(agentRegistryPoLists.size());
			List<AgentRegistryListRowsResponse> listRows = agentRegistryListResponse.getRows();
			for (AgentRegistryPo inAgentRegistryPo : agentRegistryPoLists) {
				AgentRegistryListRowsResponse row = AgentRegistryCvt.INSTANCE.queryListRowDo2Dto(inAgentRegistryPo);
				listRows.add(row);
			}
			agentRegistryListResponse.setRows(listRows);
		}

		return agentRegistryListResponse;
	}

	@Override
	public AgentRegistryResponse addAgentRegistry(AgentRegistryRequest agentRegistryAddRequest) {
		// 持久化操作
		AgentRegistryPo agentRegistryPo = AgentRegistryCvt.INSTANCE.addDto2Do(agentRegistryAddRequest);
		agentRegistryPo.setOnlineStatus(OnlineStatus.Health.value());
		agentRegistryPo.setForceOffline(YN.No.value());
		agentRegistryPo.setCreateTime(new Date());
		agentRegistryPo.setVersion(1);
		// agentRegistryPo.setUpdateTime(new Date());
		// 根据ip查询是否存在，，如果已经存在，修改原来的在线了
		String ipv4 = agentRegistryPo.getAgentIpv4();
		AgentRegistryPo agentRegistryPoDb = agentRegistryRepository.queryByIpv4(ipv4);
		if (agentRegistryPoDb == null) {
			// 保存数据
			agentRegistryRepository.insert(agentRegistryPo);
		} else {
			// 是否为禁止上线
			if (YN.Yes.value().equals(agentRegistryPoDb.getForceOffline())) {
				throw new BizException("E02099");
			}
			// 修改
			agentRegistryPo.setId(agentRegistryPoDb.getId());
			agentRegistryPo.setVersion(agentRegistryPoDb.getVersion());
			agentRegistryRepository.updateById(agentRegistryPo);
		}

		// 返回响应信息
		AgentRegistryResponse agentRegistryAddResponse = new AgentRegistryResponse();
		return agentRegistryAddResponse;
	}

	@Override
	public AgentRegistryModResponse modAgentRegistry(AgentRegistryModRequest agentRegistryModRequest) {
		// 持久化操作
		AgentRegistryPo agentRegistryPo = AgentRegistryCvt.INSTANCE.modDto2Do(agentRegistryModRequest);
		// 查询数据是否存在
		AgentRegistryPo agentRegistryPoDb = agentRegistryRepository.queryById(agentRegistryPo.getId());
		if (agentRegistryPoDb == null) {
			throw new BizException("E00001", agentRegistryModRequest.getId() + "");
		}
		// 更新数据
		agentRegistryPo.setId(agentRegistryPoDb.getId());
		// agentRegistryPo.setAzCode(agentRegistryPoDb.getAzCode());
		// agentRegistryPo.setAgentHostname(agentRegistryPoDb.getAgentHostname());
		// agentRegistryPo.setAgentIpv4(agentRegistryPoDb.getAgentIpv4());
		// agentRegistryPo.setAgentPort(agentRegistryPoDb.getAgentPort());
		// agentRegistryPo.setOnlineStatus(agentRegistryPoDb.getOnlineStatus());
		// agentRegistryPo.setAgentDesc(agentRegistryPoDb.getAgentDesc());
		// agentRegistryPo.setBizCode(agentRegistryPoDb.getBizCode());
		// agentRegistryPo.setCreateTime(agentRegistryPoDb.getCreateTime());
		agentRegistryPo.setVersion(agentRegistryPoDb.getVersion());
		// agentRegistryPo.setUpdateTime(agentRegistryPoDb.getUpdateTime());
		agentRegistryRepository.updateById(agentRegistryPo);

		// 返回响应信息
		AgentRegistryModResponse agentRegistryModResponse = new AgentRegistryModResponse();
		return agentRegistryModResponse;
	}

	@Override
	public AgentRegistryOfflineResponse offlineAgentRegistry(AgentRegistryOfflineRequest agentRegistryOfflineRequest) {
		// 查询数据是否存在
		AgentRegistryPo agentRegistryPoDb = agentRegistryRepository.queryById(agentRegistryOfflineRequest.getId());
		if (agentRegistryPoDb == null) {
			throw new BizException("E00001", agentRegistryOfflineRequest.getId() + "");
		}
		AgentRegistryPo upAgentRegistryPo = new AgentRegistryPo();
		upAgentRegistryPo.setId(agentRegistryPoDb.getId());
		upAgentRegistryPo.setOnlineStatus(OnlineStatus.Offline.value());
		upAgentRegistryPo.setVersion(agentRegistryPoDb.getVersion());
		if (YN.Yes.value().equals(agentRegistryOfflineRequest.getForceOffline())) {
			upAgentRegistryPo.setForceOffline(YN.Yes.value());
		}
		agentRegistryRepository.updateById(upAgentRegistryPo);

		return new AgentRegistryOfflineResponse();
	}

	@Override
	public AgentRegistryOnlineResponse onlineAgentRegistry(AgentRegistryOnlineRequest agentRegistryOnlineRequest) {
		// 查询数据是否存在
		AgentRegistryPo agentRegistryPoDb = agentRegistryRepository.queryById(agentRegistryOnlineRequest.getId());
		if (agentRegistryPoDb == null) {
			throw new BizException("E00001", agentRegistryOnlineRequest.getId() + "");
		}
		if (YN.Yes.value().equals(agentRegistryPoDb.getForceOffline())) {
			AgentRegistryPo upAgentRegistryPo = new AgentRegistryPo();
			upAgentRegistryPo.setId(agentRegistryPoDb.getId());
			upAgentRegistryPo.setForceOffline(YN.No.value());
			upAgentRegistryPo.setVersion(agentRegistryPoDb.getVersion());
			agentRegistryRepository.updateById(upAgentRegistryPo);
		}
		return new AgentRegistryOnlineResponse();
	}

	@Override
	public StatResponse statCountAgent(StatRequest statRequest) {
		StatResponse statResponse = new StatResponse();
		AgentRegistryPo agentRegistryPo = new AgentRegistryPo();
		long count = agentRegistryRepository.count(agentRegistryPo);
		statResponse.setCount(count);
		agentRegistryPo.setOnlineStatus(OnlineStatus.Health.value());
		long alive = agentRegistryRepository.count(agentRegistryPo);
		statResponse.setAlive(alive);
		return statResponse;
	}

}
